@ControllerAdvice is introduced from the Spring 3.2 release. In this version 3.2 It is special type of @Component to declare the global exceptions handler. When you create a class with @ControllerAdvice and then write few methods with the @ExceptionHandler annotations, any exception thrown in the application will be handled by this class. It is acting as the global exception handler. However, you can not restrict this handling to any specific type of controller or classes.
Among many new features in Spring 4 I found @ControllerAdvice improvements. @ControllerAdvice is a specialization of a @Component that is used to define @ExceptionHandler, @InitBinder, and @ModelAttribute methods that apply to all @RequestMapping methods. Prior to Spring 4, @ControllerAdvice assisted all controllers in the same Dispatcher Servlet. With Spring 4 it has changed. As of Spring 4 @ControllerAdvice may be configured to support defined subset of controllers, whereas the default behavior can be still utilized.
By using @ControllerAdvice annotation in spring 4.0 you can narrow the scope of the exception handler. For example, you can declare a exception handler which will handle only the exception thrown by the @RestController , a special type of controller introduced in the Spring 4.0.
@ControllerAdvice assisting all controllers
Let’s assume we want to create an error handler that will print application errors to the user. Let’s assume this is a basic Spring MVC application with jsp as a view engine and we have an ArticleController with the following @RequestMapping method:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("article") class ArticleController { @RequestMapping("{articleId}") @ResponseBody String getArticle(@PathVariable Long articleId) { throw new IllegalArgumentException("Getting article problem."); } }
Create RestConroller
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @RestConroller @RequestMapping("article") class ArticleController { @RequestMapping("{articleId}") String getArticle(@PathVariable Long articleId) { throw new IllegalArgumentException("Getting article problem."); } }
@ControllerAdvice for RestController
If you look at the below code, this exception handler called only when the exception is thrown from the RestController.
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @ControllerAdvice(annotations=RestController.class) @RequestMapping("article") class ArticleController { @ExceptionHandler(Exception.class) @RequestMapping("{articleId}") String getArticle(@PathVariable Long articleId) { throw new IllegalArgumentException("Getting article problem."); } }
- Spring MVC Web Tutorial
- Spring MVC Interview Questions
- MVC Design Pattern
- Spring MVC DispatcherServlet
- Spring MVC WebApplicationContext and Root Application Context
- Spring MVC @Controller Annotation
- Spring MVC @RequestMapping Annotation
- Spring MVC @RequestParam Annotation
- Spring MVC ContextLoaderListener
- Spring MVC @RequestParam and @PathVariable annotations
- Spring MVC Hello World Example
- Spring MVC Exception Handling Example
- Spring MVC with Hibernate CRUD Example
- Spring MVC Tiles Plugin with Example
- Spring MVC Interceptor with example
- Spring MVC with MongoDB CRUD Example
- Spring MVC Internationalization & Localization with Example